package com.zhangh.summer.admin.support.ds.es;

import com.zhangh.summer.admin.support.ds.common.pager.DataPager;
import com.zhangh.summer.admin.support.ds.common.pager.Pager;
import com.zhangh.summer.admin.support.ds.es.base.EsIterator;

import java.util.List;
import java.util.Map;

public interface IEsClient {
    /**
     * 通过query查询结果
     * @param query 查询json串
     * @param cls 对象bean class
     * @param <M> 对象
     * @return
     */
    public <M> String selectResponse(String query, Class<M> cls);
    /**
     * 通过queryId查询结果
     * @param queryId 查询ID，配置在xml中的query里的id
     * @param params 参数
     * @param cls
     * @param <M>
     * @return
     */
    public <M> String selectResponse(String queryId, Map<String, Object> params, Class<M> cls);
    /**
     * 通过query查询结果集合
     * @param query 查询json串
     * @param cls
     * @param <M>
     * @return
     */
    public<M> List<M> selectList(String query, Class<M> cls);

    /**
     * 通过queryId查询结果集合
     * @param queryId 查询ID，配置在xml中的query里的id
     * @param params 参数
     * @param cls
     * @param <M>
     * @return
     */
    public<M> List<M> selectList(String queryId, Map<String, Object> params, Class<M> cls);

    /**
     * 按分页查询集合
     * @param queryId
     * @param params
     * @param pager
     * @param cls
     * @param <M>
     * @return
     */
    public<M> List<M> selectList(String queryId, Map<String, Object> params, Pager pager, Class<M> cls);

    /**
     * 通过query查询第一条数据
     * @param query 查询json串
     * @param cls
     * @param needPager 是否需要分页
     * @param <M>
     * @return
     */
    public<M> M selectFirst(String query, Class<M> cls, boolean needPager);

    /**
     * 通过queryId查询第一条数据
     * @param queryId 查询ID，配置在xml中的query里的id
     * @param params 参数
     * @param cls
     * @param <M>
     * @return
     */
    public<M> M selectFirst(String queryId, Map<String, Object> params, Class<M> cls);

    /**
     * 通过主键查询
     * @param key 主键
     * @param cls
     * @param <M>
     * @return
     */
    public <M> M selectByPrimaryKey(String key, Class<M> cls);

    /**
     * 通过query分页查询
     * @param query 查询json
     * @param pager 分页
     * @param cls
     * @param <M>
     * @return
     */
    public <M> DataPager<M> selectDataPager(String query, Pager pager, Class<M> cls);

    /**
     * 通过queryId分页查询
     * @param queryId 查询ID
     * @param params 参数
     * @param pager 分页
     * @param cls
     * @param <M>
     * @return
     */
    public <M> DataPager<M> selectDataPager(String queryId, Map<String, Object> params, Pager pager, Class<M> cls);

    /**
     * 通过分页ID迭代查询
     * @param queryId 查询ID
     * @param params 参数
     * @param size 迭代数据大小，为0 默认10
     * @param scroll 为空，默认1m
     * @param cls
     * @param <M>
     * @return
     */
    public<M> EsIterator<M> selectEsIterator(String queryId, Map<String, Object> params, int size, String scroll, Class<M> cls);
    /**
     * 通过scroll 迭代查询
     * @param scroll
     * @param scrollId
     * @param cls
     * @param <M>
     * @return
     */
    public<M> List<M> selectScroll(String scroll, String scrollId, Class<M> cls);
    /**
     * 通过query查询总数据
     * @param query 查询json
     * @param cls
     * @param <M>
     * @return
     */
    public <M> Long count(String query, Class<M> cls);

    /**
     * 通过queryId 查询总数
     * @param queryId 查询ID
     * @param params 参数
     * @param cls
     * @param <M>
     * @return
     */
    public <M> Long count(String queryId, Map<String, Object> params, Class<M> cls);

    /**
     * 插入数据
     * @param m 数据对象
     * @param <M>
     */
    public <M> void insert(M m);

    /**
     * 插入或更新
     * @param t 数据对象
     * @param <T>
     */
    public <T> void insertOrUpdate(T t);

    /**
     * 批量新增或更新集合
     * @param list 集合
     * @param cls 类
     * @param <T> 类型
     */
    public <T> void batchInsertOrUpdate(List<T> list, Class<T> cls);
    /**
     * 通过query 删除数据
     * @param query
     * @param cls
     * @param <M>
     * @return
     */
    public <M> long deleteByQuery(String query, Class<M> cls);
    /**
     * 通过queryId删除数据
     * @param queryId 查询Id
     * @param params 参数
     * @param cls
     * @param <M>
     * @return
     */
    public <M> long deleteByQuery(String queryId, Map<String, Object> params, Class<M> cls);

    /**
     * 通过主键删除数据
     * @param key
     * @param cls
     * @param <M>
     * @return
     */
    public <M> long deleteByPrimaryKey(String key, Class<M> cls);

    /**
     * 通过主键更新数据
     * @param m
     * @param <M>
     * @return
     */
    public <M> long updateByPrimaryKey(M m);

    /**
     * 通过主键按照query更新数据
     * @param key 主键
     * @param query 更新json
     * @param cls
     * @param <M>
     * @return
     */
    public <M> long updateByPrimaryKeyQuery(String key, String query, Class<M> cls);

}
